fundamentals of Prolog